﻿var xmlreader = require('xmlreader');
var fs = require('fs');
var CRC= require('./crc16.js');

var DI_List =[];
var DO_List =[];
var AI_List =[];
var AO_List =[];

var xml = function(pathname,id){

	let p = new Promise(function(resolve, reject){
		fs.readFile(pathname,'utf-8',function(err,result){	
			return result;
		}
	}).then(xmlreader.read(result, function (err, res){
		return res;
	}).then(fun(res)).catch((err)=>{
		console.log(err);
	});

	var fun = function(res){

		var DataNum = res.modbusRTU.Data.count();
		var ListArray = res.modbusRTU.Data.array;
			   
		for( var i = 0;i<DataNum;i++){
						  
			//modbus  0x01
			if( ListArray[i].attributes().reg.slice(0,2)  == 'DO'  ){
			   
				var item = {
				   
					index:ListArray[i].attributes().index,
					devname:ListArray[i].attributes().name,
					devId:ListArray[i].attributes().id,
					regtype:'1',
					regaddr:ListArray[i].attributes().add,
					codeNum:ListArray[i].attributes().frame,
					datatype:ListArray[i].attributes().dtype,
					dataK:ListArray[i].attributes().k,
					dataZero:ListArray[i].attributes().zero
						   
				}
			 
			 
			   DO_List.push(item);
				  
			//modbus  0x02   
			}else if(ListArray[i].attributes().reg.slice(0,2)  == 'DI'  ){
			   
				var item = {
				   
					index:ListArray[i].attributes().index,
					devname:ListArray[i].attributes().name,
					devId:ListArray[i].attributes().id,
					regtype:'2',
					regaddr:ListArray[i].attributes().add,
					codeNum:ListArray[i].attributes().frame,
					datatype:ListArray[i].attributes().dtype,
					dataK:ListArray[i].attributes().k,
					dataZero:ListArray[i].attributes().zero
						   
				}
			   
			   DI_List.push(item);
			   
			//modbus  0x03   
			}else if(ListArray[i].attributes().reg.slice(0,2)  == 'AO' ){
			   
				var item = {
				   
					index:ListArray[i].attributes().index,
					devname:ListArray[i].attributes().name,
					devId:ListArray[i].attributes().id,
					regtype:'3',
					regaddr:ListArray[i].attributes().add,
					codeNum:ListArray[i].attributes().frame,
					datatype:ListArray[i].attributes().dtype,
					dataK:ListArray[i].attributes().k,
					dataZero:ListArray[i].attributes().zero
						   
				}
			   
			   AO_List.push(item);
			   
			 //modbus  0x04  
			}else if(ListArray[i].attributes().reg.slice(0,2)  == 'AI'  ){
		
				var info = {
				   
					index:ListArray[i].attributes().index,
					devname:ListArray[i].attributes().name,
					devId:ListArray[i].attributes().id,
					regtype:'4',
					reqNum:reqNum,
					regaddr:ListArray[i].attributes().add,
					codeNum:ListArray[i].attributes().frame,
					datatype:ListArray[i].attributes().dtype,
					dataK:ListArray[i].attributes().k,
					dataZero:ListArray[i].attributes().zero
				   
				}	
			   
				var reqNum;
				if((info.datatype == 'Word16') ||
					(info.datatype == 'UWord16')){
				 
					reqNum ='01';
					
				}else if((info.datatype == 'Float') ||
					(info.datatype == 'Int32')  ||
					(info.datatype == 'UInt32') ){
					 
					 reqNum ='02';
					 
				}
				var Addr_Hi = (info.regaddr>>8)&0xff;
				var Addr_Lo =  info.regaddr&0xff;
				var reqNum_Hi = (reqNum>>8)&0xff; 
				var reqNum_Lo =  reqNum&0xff; 

				var TCP = [
					info.devId,
					info.regtype,
					Addr_Hi,
					Addr_Lo,
					reqNum_Hi,
					reqNum_Lo,
				];
								
				var crc16 = CRC.create(TCP);
				CRC_Hi = crc16&0xff;
				CRC_Lo = (crc16>>8)&0xff;
				
				var RTU = [
					info.devId,
					info.regtype,
					Addr_Hi,
					Addr_Lo,
					reqNum_Hi,
					reqNum_Lo,
					CRC_Hi,
					CRC_Lo
					
				];

				var item = {
					type:id,
					info : info,
					TCP : TCP,
					RTU : RTU
					
				}
				   
				AI_List.push(item);				   
			}  

		}

		function compare(property){
			return function(a,b){
				var value1 = a[property];
				var value2 = b[property];
				return value1 - value2;
			}
		};

		//DO_List.sort(compare('regaddr'));
		//DI_List.sort(compare('regaddr'));
		//AO_List.sort(compare('regaddr'));
		AI_List.sort(compare('regaddr'));
				   
		return {

			DO:DO_List,
			DI:DI_List,
			AO:AO_List,
			AI:AI_List		   
		};
   
	}

}

xml('./modbusRTU_Reg.xml',1);


//module.exports = xml;
 









